package com.capgemini.cn.authority.rest.service;

import com.capgemini.cn.authority.rest.exception.AuthRestBusinessException;
import com.capgemini.cn.authority.rest.valueobject.DataResponse;
import com.capgemini.cn.authority.rest.valueobject.data.GroupListVO;
import com.capgemini.cn.authority.rest.valueobject.data.GroupVO;
import org.springframework.data.domain.Sort;

import java.util.List;
import java.util.Map;

/**
 * Created at 2017/9/25
 *
 * @author Andriy
 */
public interface GroupService extends CommonService<GroupVO> {

    /**
     * 查询单个用户组详情，包括其子集分组信息
     *
     * @param id 用户组主键ID值
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<GroupListVO> findDetail(long id);

    /**
     * 分页查询所有数据并按照指定规则排序
     *
     * @param isSearchRoot 是否只查询根用户组
     * @param page         查询的页码数，默认为0（即从第一页开始查询）
     * @param size         每页数据的条数，如果值为-1或0则表示查询所有的数据（即最大条数，此时分页参数失效）
     * @param orderProp    排序属性名称
     * @param direction    排序规则
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<List<GroupVO>> findAll(boolean isSearchRoot, int page, int size, String orderProp, Sort.Direction direction);

    /**
     * 根据角色查询用户组数据信息
     *
     * @param roleId 角色主键ID值
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<List<GroupVO>> findGroupByRole(Long roleId) throws AuthRestBusinessException;

    /**
     * 更新指定属性值
     *
     * @param id         数据ID主键值
     * @param parentId   父级用户组主键ID值，如果为空则表示不对父级用户组进行更新
     * @param properties 需要更新的属性列表，key为字符串类型用以标识需要更新的属性名称，value为对象类型用以存放更新后的数据值
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<GroupVO> update(Long id, Long parentId, Map<String, Object> properties) throws AuthRestBusinessException;
}
